package com.xingkeduo.dao.database;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.mybatis.spring.SqlSessionTemplate;

import com.xingkeduo.util.pojo.base.BaseQuery;
import com.xingkeduo.util.pojo.base.BaseTable;
import com.xingkeduo.util.pojo.domain.Page;

/**
 * 数据库对接类
 * 
 * @author GJ
 * @time 2018年12月13日 下午1:45:30
 * @description
 */
public class DatabaseAccessObject<T extends BaseTable<T>, Q extends BaseQuery<Q>> {
	private SqlSessionTemplate sqlSession;

	public DatabaseAccessObject(SqlSessionTemplate sqlSessionTemplate) {
		this.sqlSession = sqlSessionTemplate;
	}

	/**
	 * 查询实体
	 * 
	 * @author GJ
	 * @time 2016年9月17日 下午1:45:19
	 * @param id
	 * @return 单个结果
	 * @throws Exception
	 */
	public T select(String nameSpace, long id) throws Throwable {
		return sqlSession.selectOne(nameSpace + ".selectRow", id);
	}

	/**
	 * 查询实体
	 * 
	 * @author GJ
	 * @time 2016年9月17日 下午1:45:13
	 * @param c
	 * @return 集合
	 * @throws Exception
	 */
	public List<T> select(String nameSpace, Q q) throws Throwable {
		/**
		 * 遍历ID集合，移除缓存中存在的ID，并保存在tList中
		 */
		List<Long> idList = selectIndex(nameSpace, q);
		if (idList == null || idList.size() < 1)
			return Collections.emptyList();

		return sqlSession.selectList(nameSpace + ".selectRows", idList);
	}

	/**
	 * 查询索引(主键)
	 * 
	 * @author GJ
	 * @time 2016年9月17日 下午1:44:24
	 * @param c
	 * @return 几个
	 * @throws Exception
	 */
	public List<Long> selectIndex(String nameSpace, Q q) throws Throwable {
		return sqlSession.selectList(nameSpace + ".selectIndex", q);
	}

	/**
	 * 统计个数
	 * 
	 * @author GJ
	 * @time 2016年9月17日 下午1:45:07
	 * @param c
	 * @return
	 * @throws Exception
	 */
	public int selectCount(String nameSpace, Q q) throws Throwable {
		return sqlSession.selectOne(nameSpace + ".selectCount", q);
	}

	/**
	 * 插入一条记录
	 * 
	 * @author GJ
	 * @time 2016年9月17日 下午1:44:59
	 * @param d
	 * @return
	 * @throws Exception
	 */
	public int insert(String nameSpace, T t) throws Throwable {
		return sqlSession.insert(nameSpace + ".insertRow", t);
	}

	/**
	 * 插入多条记录
	 * 
	 * @author GJ
	 * @time 2016年9月17日 下午1:44:53
	 * @param list
	 * @return
	 * @throws Exception
	 */
	public int insert(String nameSpace, List<T> tList) throws Throwable {
		return sqlSession.insert(nameSpace + ".insertRows", tList);
	}

	/**
	 * 修改指定主键的记录
	 * 
	 * @author GJ
	 * @time 2016年9月17日 下午1:44:47
	 * @param d
	 * @return
	 * @throws Exception
	 */
	public int update(String nameSpace, T t) throws Throwable {
		return sqlSession.update(nameSpace + ".updateRow", t);
	}

	/**
	 * 修改多条记录
	 * 
	 * @author GJ
	 * @time 2016年9月17日 下午1:43:29
	 * @param d
	 * @param c
	 * @return
	 * @throws Exception
	 */
	public int update(String nameSpace, T t, Q q) throws Throwable {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("t", t);
		map.put("q", q);

		sqlSession.selectOne(nameSpace + ".updateRows", map);
		return 1;
	}


	/**
	 * 分页
	 * 
	 * @version id:v0.1
	 *
	 * @param q
	 *            查询条件
	 * @param pageNo
	 *            第几页
	 * @param pageSize
	 *            每页数量
	 * @return 返回结果的数据类型 返回结构的描述
	 */
	@Deprecated
	public Page<T> pageSelect(String nameSpace, Q q, Integer pageNo, Integer pageSize) throws Throwable {
		int count = this.selectCount(nameSpace, q);
		Page<T> page = new Page();
		page.setPageSize(pageSize);
		page.setPageNo(pageNo);
		page.init(count);
		if (count == 0) {
			page.setDtoList(Collections.emptyList());
		} else {
			q.setRecordStart(page.getRecordStart());
			q.setRecordEnd(page.getRecordEnd());
			page.setDtoList(this.select(nameSpace, q));
		}
		return page;
	}
}
